import { Component, Input, OnInit, ViewChild } from '@angular/core';
import { FormBuilder, FormControl, FormGroup,  Validators } from '@angular/forms';
import { SFSchema } from '@delon/form';
import { ApiService } from '@core/services/api';
import { HttpClient } from '@angular/common/http';
import { NzMessageService, NzModalService ,NzModalRef} from 'ng-zorro-antd';
import { NzRadioModule } from 'ng-zorro-antd/radio';
import * as moment from 'moment';
import { reader }from '../../../../../assets/js/rdapi.js'
import { UtilService } from '@core/services/util.service';
//declare var reader:any;



@Component({
  selector: 'app-new-card-set',
  templateUrl: './new-card-set.component.html',
  styleUrls: ["./newCardSet.css"]
})
export class NewCardSetComponent implements OnInit {
  @Input()type: 0 | 1;
  @Input()userName:any;
  @Input()id:any;
  @Input()doorCard:any;
  @Input()xnCardNo:any;
  @Input()xuDate:any;//续期时的初始化日期
  @Input()cardStatus:any; // 6 已过期
  @Input()startDate:any;
  @Input()flag:Boolean;
  @Input()cardCode:any;
  @Input()roomId:string;
  @Input()
  set program(value:any){
    if(!value) return;
    this.monthlyRent=value.monthlyRent / 100;
    this.itemId=value.itemId;
  }
  
  sure:Boolean=false;//如果为true则代表用户第一次已经点击确定继续办卡，则后面再办卡不出现此弹框,
  g_device:string="00";
  g_isOpen:boolean= false;
  g_wantFunc:number=0;
  show:boolean=true;
  cardNo:string;
  itemId:any;
  validateForm!: FormGroup;
  param: any;
  cashMoney:number = 0.01;//押金
  monthlyRent:number=0;//月租
  totalMoney:number = 0.01;//总计
  manageMoney:number = 0;//管理费
  month:number = 0;//有效期
  index:number = 0;
  cardList:any=[];
  permissionList:any=[];
  loginUser:string;
  userId:string;


  desNum="";
  readData=0;//读出的数据
  pwd="FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";//密钥
  num=0;//web认证的次数 现在设置为两次，两次不成功的话就不再继续
  inNum=0;//代表创建两个二进制文件
  select=0;//复位
  random=0;//获取随机数
  delfile=0;//擦除MF下的数据
  createSK=0;//创建密钥文件
  sk=0;//增加外部认证密钥
  createTwo=0;//创建二进制文件
  writeFile=0;//写入二进制文件
  readFile=0;//读取二进制文件
  monthList:any =[
    {
      value:"1个月",
      code:1,
      selected:false,
    },
    {
      value:"2个月",
      code:2,
      selected:false,
    },
    {
      value:"3个月",
      code:3,
      selected:false,
    },
    {
      value:"4个月",
      code:4,
      selected:false,
    },
    {
      value:"5个月",
      code:5,
      selected:false,
    },
    {
      value:"6个月",
      code:6,
      selected:false,
    },
    {
      value:"7个月",
      code:7,
      selected:false,
    },
    {
      value:"8个月",
      code:8,
      selected:false,
    },
    {
      value:"9个月",
      code:9,
      selected:false,
    },
    {
      value:"10个月",
      code:10,
      selected:false,
    },
    {
      value:"11个月",
      code:11,
      selected:false,
    },
    {
      value:"1年",
      code:12,
      selected:false,
    },
    {
      value:"2年",
      code:24,
      selected:false,
    }
    
  ]
  constructor(private util:UtilService,private http: HttpClient,  private api: ApiService, private modal: NzModalService,private modalRef: NzModalRef, private message: NzMessageService,private fb: FormBuilder) { }
  ngOnInit() {
    let userData:any=this.util.getStorage("userNow");
    userData=JSON.parse(userData);
    this.loginUser=userData.userName;
    this.userId=userData.id;
    this.xuDate=moment(this.xuDate).format('yyyy-MM-DD');
    this.getPermission();
    if(this.type == 0){//新办
      if(reader.SocketOpen){
        this.connect();
      }else{
        reader.createSocket();
        setTimeout(()=>{
          this.connect();
        },200)
      }
      this.getCardList();
      this.validateForm = this.fb.group({
        userName: [this.userName, [Validators.required]],
        date: [null, [Validators.required]],
        doorCard:[null],
        cardNo:[null,[Validators.required]],
        remark:[null],
        cardCode:[null,[Validators.required]],
        xnCardNo:[null,[Validators.required]]
      });
    }else if(this.type ==1){//续期
      this.show=false;
      this.cashMoney=0;
      this.totalMoney=0;
      this.cardNo=this.doorCard;
      this.cardList.push({
        "cardNo":this.doorCard
      })
      this.validateForm = this.fb.group({
        userName: [{value:this.userName,disabled:true}, [Validators.required]],
        date: [null, [Validators.required]],
        doorCard:[null],
        cardNo:[{value:this.doorCard,disabled:true}, [Validators.required]],
        remark:[null],
        cardCode:[{value:this.cardCode,disabled:true},[Validators.required]],
        xnCardNo:[{value:this.xnCardNo,disabled:true},[Validators.required]]//虚拟卡号
      });
      this.validateForm.patchValue({
        date:this.xuDate
      })
      if(this.cardStatus == 6){//卡已过期
        this.xuDate = this.getNowDate()
      }
      if(this.cardCode != null && this.cardCode != undefined){
        this.validateForm.patchValue({
          cardCode:this.cardCode
        })
      }
    }

    reader.onResult((rData:any)=>{
      console.log(rData)
      this.inNum++;
      if(rData.strCmdCode == "1203"){
        let str=rData.strData;
        let a=str.substring(str.length-4,str.length);
        if(a != "9000" ){//证明出现错误
          if(this.delfile == 1){//代表密钥错误，需要用新的密钥，然后获取并发送八字节加密数据
            this.select=1;
            this.delfile=0;
            this.pwd="0123321456654789987ABCDEFFEDCBC1";//用新的密钥去认证
            if(this.num == 2){//如果认证两次依然错误的话，则不再继续
              this.message.error('密钥错误')
              return;
            }
          }else{
            return;
          }
        }
      }

      if(this.readData == 1){//代表读取二进制文件
        this.cardList.unshift({
          "cardNo":this.cardNo
        });
        this.checkCard();
       let n=rData.strData.slice(0,16);
       this.validateForm.patchValue({
        xnCardNo:n
      })
       this.readData=0;
      }
      
      if(this.select == 1 ){//获取随机数 已复位
        this.getRandom();
        this.random=1;
        this.select=0;
      }else if(this.random == 1 ){//发送八字节加密数据
        //获取八字节加密数据，然后发送八字节加密数据
        this.getDesNum(rData.strData.slice(0,16)).then((res)=>{
          this.getNumber();
        });
        this.num++;
        this.delfile=1;
        this.random=0;
      }else if(this.delfile == 1 ){
        this.delData();
        this.createSK=1;
        this.delfile=0;
      }else if(this.createSK == 1 ){
        this.createFile();
        this.sk=1;
        this.createSK=0;
      }else if(this.sk == 1 ){
        this.addSK();
        this.createTwo=1;
        this.sk=0;
      }else if(this.createTwo == 1 ){
        this.createHex();
        this.writeFile=1;
        this.createTwo=0;
        this.inNum=0;
      }else if(this.writeFile == 1 && this.inNum == 2){//index=2代表两个二进制文件已经创建完成，然后执行写二进制文件
        this.writeHex();
        this.writeFile=0;
        this.readFile=1;
        this.inNum=0;
      }else if(this.readFile == 1 && this.inNum == 2){//读取二进制文件  index=2代表两个二进制文件已经写入完成，可以执行读二进制文件
        this.readHex();
        this.readFile=0;
        this.readData=1;
      }


      switch(rData.strCmdCode){
        case "0007":
          if(rData.strStatus != "00"){
            this.message.error("连接设备失败!");
          }else{
            this.g_isOpen=true;
            console.log("连接成功")
          }
          break;
        case "1001":
          if(rData.strStatus != "00"){
            return;
          }
          switch(this.g_wantFunc){
             case 1:
              reader.send(this.g_device + "1002"); //TyA_Anticollision
              break;
          }
          break;
        case "1002":
          if(rData.strStatus != "00"){
            return;
          }
          switch(this.g_wantFunc){
              case 1 :
                this.validateForm.patchValue({
                  cardNo:rData.strData
                })
                this.cardList.unshift({
                  "cardNo":rData.strData
                });
                this.cardNo=rData.strData;
                this.validateForm.patchValue({
                  xnCardNo:rData.strData
                })
                this.checkCard();
              break;
          }
          break;
          case "1202"://复位
						this.cardNo=rData.strData.slice(0,8);
						console.log("选择MF");
						reader.send(this.g_device + "1203" + "00A40000023F00");//选择MF
						this.select=1;
					break;
          case "2303":
            if(rData.strStatus == '00'){//寻卡成功之后发送读身份证物理卡号的命令
            reader.send(this.g_device + "2304")  //发送读身份证物理卡号的命令
          }
          break;
        
        case "2304":
            if(rData.strStatus == '00'){
              this.cardList.unshift({
                "cardNo":rData.strData
              });
              this.cardNo=rData.strData
              let n=rData.strData.slice(0,16);
              this.validateForm.patchValue({
                xnCardNo:n
              })
          }
          break;
      }
    })
  }
  ngOnDestroy(){
    reader.Disconnect();
  }
    //提交数据
  submitForm(value: any): void {
    let that=this;
    for (const key in this.validateForm.controls) {
      this.validateForm.controls[key].markAsDirty();
      this.validateForm.controls[key].updateValueAndValidity();
      if(this.validateForm.controls[key].invalid){
        return;
      }
    }
    if(this.flag && !this.sure){
      this.modal.create({
        nzTitle: '提示',
        nzContent: '您已办过卡,是否继续?',
        nzWidth: 300,
        nzOnOk(){
          that.sure=true;
        }
      })
      return;
    }
    console.log(value);
    let date=moment(value.date).format('yyyy-MM-DD');
    const body:any={
      "personId":this.id,
      "itemId":this.itemId,
      "payCodingId":value.cardNo,
      "cardId":value.cardNo,
      "cardNo":value.xnCardNo,
      "payMoney":this.totalMoney * 100,
      "payWay":3,
      "startTime":"",
      "endTime":date+" 00:00:00",
      "monthMoney":this.monthlyRent * 100,//月租
      "cardCode":value.cardCode,
      "payDeposit":this.cashMoney * 100,//押金
      "monthServe":this.month, //月数
      "createBy": this.loginUser,
      "createId": this.userId,
      "payRoom": this.roomId,
      "businessType": "",//业务类型
  }
    if(this.type == 0){//新办
      body.startTime=this.getNowDate()+" 00:00:00";
      body.businessType="1";
    }else if(this.type == 1){//续期
      body.startTime=moment(this.startDate).format('yyyy-MM-DD')+" 00:00:00";
      body.cardNo=this.xnCardNo;
      body.cardId=this.doorCard;
      body.payCodingId=this.doorCard;
      body.cardCode=this.cardCode;
      body.businessType="2";
    }
    console.log(body);
    this.http.post(this.api.doorCard.bindingCardAndPay.url,body).subscribe((res:any)=>{
      if (res.status === '200') {
        this.message.success('操作成功');
        this.modalRef.triggerOk();
      } else {
        this.message.error(res.message)
      }
    })

    // this.http.post(this.api.doorCard.bindingCardAndPay.url,body,{responseType: "arraybuffer"}).subscribe((res:any)=>{
    //   let src='data:image/png;base64,' + btoa(new Uint8Array(res).reduce((data, byte) => data + String.fromCharCode(byte), ''));
    //   const modal = this.modal.create({
    //     nzTitle: '付款码',
    //     nzContent: '<img width="100%" src="'+src+'">',
    //     nzWidth: 400,
    //     nzFooter: [
    //       {
    //         label:"支付完成",
    //         type:"primary",
    //         onClick:()=>{
    //            modal.close();
    //            this.modalRef.triggerOk();
    //         }
    //       }
    //     ]
    //   })
    // })
  }

  resetForm(e: MouseEvent): void {
    e.preventDefault();
    this.validateForm.reset();
    for (const key in this.validateForm.controls) {
      this.validateForm.controls[key].markAsPristine();
      this.validateForm.controls[key].updateValueAndValidity();
    }
  }

  //点击有效期时长
  monthClick(item:any,i:any):void{
    for(let index in this.monthList){
      if(index == i){
        this.monthList[index].selected=true;
      }else{
        this.monthList[index].selected=false;
      }
    }
      let num=item.code;
      this.month=item.code;
      this.totalMoney=(this.cashMoney * 100 + num * this.monthlyRent *100) / 100;
      this.manageMoney=num * this.monthlyRent;
      this.index = 1;
    if(this.type == 0){//新办
      //根据选择的月数计算日期
      this.validateForm.patchValue({
        date:this.getDate(item.code)
      })
    }else if(this.type == 1){//续期
      //根据选择的月数计算日期
      this.validateForm.patchValue({
        date:this.getXuDate(item.code)
      })
    }
  }
 //续期时根据月数计算日期
 getXuDate(num:number){
  let arr=this.xuDate.split("-");
  let nowYear=parseInt(arr[0]);
  let nowMonth=parseInt(arr[1]);
  let nowDay=parseInt(arr[2]);
  let futureMonth=nowMonth + num;
  let addYear = Math.floor(futureMonth / 12);
  let calcMonth = futureMonth % 12;
  if (calcMonth === 0) {  // 如果跨度正好是整年，则特殊处理
      calcMonth = 12;
      addYear -= 1;   // 年份需要再减一
  }
  nowYear += addYear;
  nowMonth = calcMonth;
  if (nowMonth === 2 && nowDay > 28) { // 2月份最多只有28天
      if ((nowYear % 4 === 0 && nowYear % 100 !== 0) || nowYear % 400 === 0) {
          nowDay = 29;
      } else {
          nowDay = 28;
      }
  } else if ([4, 6, 9, 11].includes(nowMonth) && nowDay > 30) { // 4、6、9、11月份最多只有30天
      nowDay = 30;
  }
  return nowYear+"-"+nowMonth+"-"+nowDay;
}
   //新办时根据月数计算日期
   getDate(num:number){
    let date=new Date();
    let nowYear=date.getFullYear();
    let nowMonth=date.getMonth() + 1;
    let nowDay=date.getDate();
    let futureMonth=nowMonth + num;
    let addYear = Math.floor(futureMonth / 12);
    let calcMonth = futureMonth % 12;
    if (calcMonth === 0) {  // 如果跨度正好是整年，则特殊处理
        calcMonth = 12;
        addYear -= 1;   // 年份需要再减一
    }
    nowYear += addYear;
    nowMonth = calcMonth;
    if (nowMonth === 2 && nowDay > 28) { // 2月份最多只有28天
        if ((nowYear % 4 === 0 && nowYear % 100 !== 0) || nowYear % 400 === 0) {
            nowDay = 29;
        } else {
            nowDay = 28;
        }
    } else if ([4, 6, 9, 11].includes(nowMonth) && nowDay > 30) { // 4、6、9、11月份最多只有30天
        nowDay = 30;
    }
    return nowYear+"-"+nowMonth+"-"+nowDay;
  }

  //新办时计算两个日期之间的月数
  monthsBetw(date2):number{
    let date=new Date();
    let year1=date.getFullYear();
    let month1=date.getMonth() + 1;
    let day1=date.getDate();
    date2=date2.split("-");
    let year2=parseInt(date2[0]);
    let month2=parseInt(date2[1]);
    let day2=parseInt(date2[2]);
    if(day2 > day1){
      var num=1;
    }else{
      var num=0;
    }
    let months=(year2 - year1) * 12 +(month2 - month1) + num;
    return months;
  }
  
  //续期时计算两个日期之间的月数
  monthsBetwXu(date3):number{
    let arr=this.xuDate.split("-");
    let year1=parseInt(arr[0]);
    let month1=parseInt(arr[1]);
    let day1=parseInt(arr[2]);
    date3=date3.split("-");
    let year2=parseInt(date3[0]);
    let month2=parseInt(date3[1]);
    let day2=parseInt(date3[2]);
    if(day2 > day1){
      var num=1;
    }else{
      var num=0;
    }
    let months=(year2 - year1) * 12 +(month2 - month1) + num;
    return months;
  }
  //日期改变的回调
  onChange(result: Date): void {
    if(this.index == 1){//点击有效期月数的时候会触发这个方法，解决result日期验证的问题，
      this.index = 0;
      return;
    }
    let year=result.getFullYear();
    let month=result.getMonth() + 1;
    let day = result.getDate();
    if(this.type == 0){//新办
      this.month=this.monthsBetw(year+"-"+month+"-"+day);
    }else if(this.type == 1){//续期
      this.month=this.monthsBetwXu(year+"-"+month+"-"+day);
    }
    this.totalMoney=(this.cashMoney * 100+ this.month * this.monthlyRent * 100) / 100;
    this.manageMoney=this.month *  this.monthlyRent;
  }

  //卡号输入框失焦验证卡号是否已被绑定
  // iptBlur(){
  //   this.checkCard();
  // }

//获取卡列表
getCardList(){
  this.http.post(this.api.doorCard.list.url,{"cardNo":""}).subscribe((res:any)=>{
    let list=res.data;
    // for(let item of list){
    //   if(item.cardNo.length > 8){
    //     item.cardNo=item.cardNo.substring(0,8);
    //   }
    // }
    this.cardList=list;
    // this.cardList.push({
    //   cardNo:"1C7AE868"
    // })
    // this.cardList.push({
    //   cardNo:"E11FF0EC"
    // })
    // this.cardList.push({
    //   cardNo:"C13985CB"
    // })
  })
}
//根据人员ID查询门禁权限
getPermission(){
  this.http.post(this.api.doorCard.searchPer.url,{"id":this.id}).subscribe((res:any)=>{
    this.permissionList=res.data;
  })
}

//读卡或者输完卡号之后，检查此卡是否已经被绑定
checkCard(){
  if(this.cardNo == "" || this.cardNo == undefined){
    return;
  }
  const that=this;
  this.http.get(this.api.doorCard.checkCard.url+this.cardNo).subscribe((res:any)=>{
    console.log(res);
    if(res.status == 200){
      if(res.data != null && res.data.personId != "" && res.data.personId != null){
            this.message.error("此卡已经被绑定!");
            setTimeout(function(){
              that.cardList.shift();
              that.cardNo="";
              that.validateForm.patchValue({
                xnCardNo:""
              })
            },1000);
        }
    }
  })
}

//获取当前日期
getNowDate(){
  let date=new Date();
  let year=date.getFullYear();
  let month:any=date.getMonth() + 1;
  let day:any=date.getDate();
  if(month < 10){
    month ="0"+month;
  }
  if(day<10){
    day="0"+day;
  }
  return year+"-"+month+"-"+day;
}


connect(){
	reader.send(this.g_device + "0007" + "00"); //Open the USB device with index number 0. (打开索引号为0的USB设备)
	reader.send(this.g_device + "0109" + "41"); //Set to ISO14443a working mode. (设置为ISO14443A工作模式)
	reader.send(this.g_device + "0108" + "01"); //Turn on the reader antenna. (打开读卡器天线)
  this.LedGreen();
  setTimeout(()=>{this.LedRed()},200);
  reader.send(this.g_device + "0106" + "10"); //Beeps. (蜂鸣提示)
}
/**
 * Turn on the green light
 * (亮绿灯)
**/
LedGreen()
{
  reader.send(this.g_device + "0107" + "02"); 
}

/**
 * Turn on the red light
 * (亮红灯)
**/
LedRed()
{
  reader.send(this.g_device + "0107" + "01"); 
}


//读身份证
readID(){
  reader.send(this.g_device + "0109" + "42");//设置读写器射频工作模式，0x41:设置为TYPE_A方式，可读cpu卡,  0x42: 设置为TYPE_B方式，可读身份证物理卡号
	reader.send(this.g_device + "0108" + "00"); //Turn off the reader antenna. (关闭读卡器天线)
	reader.send(this.g_device + "0108" + "01"); //Turn on the reader antenna. (打开读卡器天线)   关闭打开天线可以为卡片重新上电
  reader.send(this.g_device + "2303" + "0");//寻卡
}

//读cpu卡
read(){
  // if(this.g_isOpen != true){
  //   this.message.error("请连接读卡器!");
  //   return;
  // }
  reader.send(this.g_device + "0109" + "41");//设置读写器射频工作模式，0x41:设置为TYPE_A方式，可读cpu卡,  0x42: 设置为TYPE_B方式，可读身份证物理卡号
	reader.send(this.g_device + "0108" + "00"); //Turn off the reader antenna. (关闭读卡器天线)
	reader.send(this.g_device + "0108" + "01"); //Turn on the reader antenna. (打开读卡器天线)   关闭打开天线可以为卡片重新上电
  this.num=0;
  this.selectMF();
}

//复位之后才能发送cos命令
selectMF(){
  console.log("复位");
  console.log(1);
  this.select=0;
  reader.send(this.g_device + "1202" + "26");//复位
}

//获取四字节随机数
getRandom(){
  console.log("获取八字节随机数")
  console.log(2);
  reader.send(this.g_device + "1203" + "0084000008");//获取四字节随机数
}

//发送八字节加密数据
getNumber(){
  console.log("发送八字节加密数据");
  console.log(3);
  console.log(this.desNum)
  reader.send(this.g_device + "1203" + "0082000008" + this.desNum);
}
//擦除MF下的数据
delData(){
  console.log("擦除MF下的数据");
  console.log(4);
  //擦除MF下的数据
  reader.send(this.g_device + "1203" + "800E000000");
}
//建立密钥文件
createFile(){
  //建立密钥文件
  console.log("建立密钥文件");
  console.log(5);
  reader.send(this.g_device + "1203" + "80E00000073F005001F1FFFF");
}
//增加外部认证密钥
addSK(){
  console.log("增加外部认证密钥");
  console.log(6);
  reader.send(this.g_device + "1203" + "80D401001539F0F1AADD"+"0123321456654789987ABCDEFFEDCBC1");
  //reader.send(g_device + "1203" + "80D401000D39F0F1AADD"+"FFFFFFFFFFFFFFFF");
}
//创建二进制文件
createHex(){
  console.log("创建二进制文件");
  console.log(7);
  reader.send(this.g_device + "1203" +"80E0001F07280020F0F1FFFF");//31号文件
  reader.send(this.g_device + "1203" +"80E0001A07280020F0F1FFFF");//26号文件
  
}
//写二进制文件
async writeHex(){
  console.log("写二进制文件");
  console.log(8);
  //this.getDesNum(this.cardNo+"00000000").then((res)=>{
  //   console.log('虚拟卡号',this.desNum)
  //   reader.send(this.g_device + "1203" +"00D69F0008"+"8F4C3814C3B499A9");//31号文件
  //   reader.send(this.g_device + "1203" +"00D69A0008"+this.desNum);//26号文件
  // })
  await this.getDesNum(this.cardNo+"00000000")
  reader.send(this.g_device + "1203" +"00D69F0008"+"8F4C3814C3B499A9");//31号文件
  reader.send(this.g_device + "1203" +"00D69A0008"+this.desNum);//26号文件
 
}
//读二进制文件
readHex(){
  console.log("读二进制文件");
  console.log(9);
  reader.send(this.g_device + "1203" +"00B09A0010");
}

//获取八字节加密数据
getDesNum(randomNum){
 return  new Promise((resolve)=>{
    this.http.post("/core/door/card/desCard?data="+randomNum+"&password="+this.pwd,{}).subscribe((res:any)=>{
      console.log(res)
      this.desNum=res.data
      resolve(res.data)
    })
  })
}
// //读卡
readCpu(){
  if(this.g_isOpen != true){
    this.message.error("请连接读卡器!");
    return;
  }
  //Start read UID
  reader.send(this.g_device + "1001" + "52"); //TyA_Request
  this.g_wantFunc = 1;  
  reader.send(this.g_device + "0106" + "10"); //Beeps. (蜂鸣提示)
}

// //连接读卡器
// Connect(){
// 	reader.send(this.g_device + "0007" + "00"); //Open the USB device with index number 0. (打开索引号为0的USB设备)
// 	reader.send(this.g_device + "0109" + "41"); //Set to ISO14443a working mode. (设置为ISO14443A工作模式)
// 	reader.send(this.g_device + "0108" + "01"); //Turn on the reader antenna. (打开读卡器天线)
//  this.LedGreen();
//  let that=this;
//   setTimeout(function(){that.LedRed()},200); 
//   reader.send(this.g_device + "0106" + "10"); //Beeps. (蜂鸣提示)
// }

// LedGreen(){
//  reader.send(this.g_device + "0107" + "02"); 
// }

// LedRed(){
//   reader.send(this.g_device + "0107" + "01"); 
// }


}
